package main

import (
	"log"
	"os"

	"github.com/consensys/gnark-crypto/ecc"
	"github.com/consensys/gnark/backend/groth16"
	"github.com/consensys/gnark/frontend"
	"github.com/consensys/gnark/frontend/cs/r1cs"

	"client2/zkp" // 使用网关端的电路定义
)

func main() {
	log.Println("🔧 开始 ZKP Trusted Setup（使用网关端电路）...")

	// 1. 使用网关端的电路定义
	circuit := &zkp.AuthCircuit{}
	ccs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, circuit)
	if err != nil {
		log.Fatal("❌ 电路编译失败:", err)
	}
	log.Println("✅ 电路编译完成")

	// 2. 执行 Trusted Setup
	pk, vk, err := groth16.Setup(ccs)
	if err != nil {
		log.Fatal("❌ Trusted Setup 失败:", err)
	}
	log.Println("✅ Trusted Setup 完成")

	// 3. 保存 proving key（给网关客户端）
	pkFile, err := os.Create("auth_proving.key")
	if err != nil {
		log.Fatal("❌ 创建 proving key 文件失败:", err)
	}
	defer pkFile.Close()
	_, err = pk.WriteTo(pkFile)
	if err != nil {
		log.Fatal("❌ 写入 proving key 失败:", err)
	}

	// 4. 保存 verifying key（给Edge服务端）
	vkFile, err := os.Create("auth_verifying.key")
	if err != nil {
		log.Fatal("❌ 创建 verifying key 文件失败:", err)
	}
	defer vkFile.Close()
	_, err = vk.WriteTo(vkFile)
	if err != nil {
		log.Fatal("❌ 写入 verifying key 失败:", err)
	}

	log.Println("\n📦 密钥文件已生成:")
	log.Println("  ✓ auth_proving.key  → 复制到网关客户端项目根目录")
	log.Println("  ✓ auth_verifying.key → 复制到Edge服务端项目根目录")
	log.Println("\n⚠️  注意：这两个密钥必须配对使用！")
}
